package com.mrper.ext.adapter;

import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by admin on 2016/3/8.
 * 基础数据适配器
 */
@SuppressWarnings("all")
public abstract class BasicAdapter<T> extends BaseAdapter {

    private Context context;
    private int layoutId;
    private List<T> source;
    private SparseArray<View> viewCache = new SparseArray<>();

    public BasicAdapter(Context context,int layoutId){
        this(context,layoutId,null);
    }

    public BasicAdapter(Context context, int layoutId, List<T> source){
        this.context = context;
        this.layoutId = layoutId;
        this.source = source == null? new ArrayList<T>():source;
    }

    /**
     * 添加数据项
     * @param item
     */
    @SuppressWarnings({"unchecked","varargs"})
    public synchronized void addItem(T... item){
        if(item!=null && item.length>0){
            if(source!=null) source.addAll(Arrays.asList(item));
        }
    }

    /**
     * 添加数据项
     * @param isClear 是否清空数据
     * @param item 数据集
     */
    @SuppressWarnings({"unchecked","varargs"})
    public synchronized void addItem(boolean isClear,T... item){
        if(isClear)
            source.clear();
        addItem(item);
    }

    /**
     * 添加数据项
     * @param item
     */
    public synchronized void addItem(List<T> item){
        if(item!=null && item.size()>0)
            source.addAll(item);
    }

    /**
     * 添加新数据
     * @param item 数据项集合
     * @param isClear 是否清空原数据
     */
    public synchronized void addItem(List<T> item,boolean isClear){
        if(isClear) source.clear();
        addItem(item);
    }

    /**
     * 在指定位置添加数据项
     * @param position
     * @param item
     */
    public synchronized void addItem(int position,T item){
        if(item !=null && source!=null){
            source.add(position,item);
        }
    }

    /**
     * 移除一项数据
     * @param item
     */
    public synchronized void remove(T item){
        if(item!=null && source!=null){
            source.remove(item);
        }
    }

    /**
     * 移除某个位置的一项数据
     * @param position
     */
    public synchronized void remove(int position){
        if(source!=null)
            source.remove(position);
    }

    /** 清空数据集  **/
    public synchronized void clear(){
        source.clear();
    }

    /**
     * 获取某个索引位置的数据
     * @param position
     * @return
     */
    public T getItemAtPosition(int position){
        return source.get(position);
    }

    @Override
    public int getCount() {
        return source == null?0:source.size();
    }

    @Override
    public Object getItem(int position) {
        return source.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    @SuppressWarnings("unchecked")
    public View getView(int position, View convertView, ViewGroup parent) {
        final T item = source.get(position);
        if(convertView == null){
            convertView = View.inflate(context,layoutId,null);
            initItemView(viewCache,convertView);
            convertView.setTag(convertView);
        }else{
            viewCache = (SparseArray<View>) convertView.getTag();
        }
        setItemValues(viewCache,position,item);
        return convertView;
    }

    /**
     * 初始化列表项视图
     * @param viewCache
     * @param itemView
     */
    public void initItemView(SparseArray<View> viewCache,View itemView){}

    /**
     * 设置列表项的值
     * @param viewCache
     * @param position
     * @param item
     */
    public abstract void setItemValues(SparseArray<View> viewCache,int position,T item);

}
